package com.mcms.web.vo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import com.mcms.util.DBHelper;

/**
 * 数据字典Cache类
 * 格式说明：
 * 1.数据字典
 * 外层map为hashMap，key为dictType,value为treeMap
 * 内层treeMap格式，key为字典项的key，value为字典项的value
 * 2.药物key，药物名称为value
 * outSideMap.put("MEDI", MEDIMap);
 * 3.药物key，药物对象为value(对象元素对应药物信息表字段)
 * outSideMap.put("MEDIINFO", MEDIINFOMap);
 * 4.用户key，用户名称为value
 * outSideMap.put("USER", innerMap4Name);
 * 5.用户key，用户登录名称为value
 * outSideMap.put("LOGINUSER", innerMap4LoginName);
 * 6.部门key，部门名称为vlaue
 * outSideMap.put("DEPT", innerMap4Name);
 * 7.部门key，部门内的所有用户ID-treeMap为value
 * outSideMap.put("DEPTUSER", deptUserMap);
 * 8.用户key，用户所在部门id为value
 * outSideMap.put("USERDEPT", userDeptMap);
 * @author 
 */
public class DictCache {
	private static DictCache instance;
	private Map outSideMap = new HashMap();// 放置字典类别
	
	private DictCache(){
		
	}
	
	public synchronized static DictCache getInstance(){
		if(instance==null){
			instance=new DictCache();
		}
		return instance;
	}
	
	/**
	 * 对外提供的方法：从数据库中重新加载字典
	 * 适用于：修改字典类的值后，重新加载生效
	 */
	public void reload(){
		this.outSideMap.clear();
		this.loadDict();
		this.loadDept();
		this.loadDeptUser();
		this.loadMedi();
		this.loadUser();
	}

	/**
	 * 对外提供的方法：从数据库中重新加载字典
	 * 适用于：修改字典类的值后，重新加载生效
	 */
	public void load(){
		this.loadDict();
		this.loadDept();
		this.loadDeptUser();
		this.loadMedi();
		this.loadUser();
		this.printOutMap();
	}
	
	/**
	 * 对外提供的方法：获取指定字典类的map
	 * @param dictType
	 * @return TreeMap
	 */
	public Map getDictMapByType(String dictType){
		
		if(dictType!=null && dictType.trim().length()>0){
			return (Map) this.getInstance().outSideMap.get(dictType);
		}else{
			return null;
		}
	}
	
	/**
	 * 对外提供的方法：获取指定字典类的List
	 * @param dictType
	 * @return ArrayList
	 */
	public List getDictListByType(String dictType){
		
		if(dictType!=null && dictType.trim().length()>0){
			Map map = (Map)this.getInstance().outSideMap.get(dictType);
			List list = new ArrayList();
			
			Set setInner =map.keySet();//       
			Iterator it=setInner.iterator();//       
			while(it.hasNext()){//           
				String types= (String) it.next();//
				String values = (String) map.get(types);
				list.add(new HashMap().put(types, values));
			}
			return list;
		}else{
			return null;
		}
	}
	
	/**
	 * 对外提供的方法：从用户视图中加载用户信息
	 */
	public void loadUser(){
		// 从表中查询出数据
		String sql ="select id,name,loginname from view_mcms_user_info order by id";
		DBHelper dbh = DBHelper.getInstance();
		List listResult = dbh.query(sql);
		
		// 保存至本类
		Map innerMap4Name = new TreeMap();
		Map innerMap4LoginName = new TreeMap();
		for(int i=0;i<listResult.size() ;i++){
			Map<String, String> map = (Map<String, String>) listResult.get(i);
			innerMap4Name.put(map.get("id"),map.get("name"));
			innerMap4LoginName.put(map.get("id"), map.get("loginname"));
		}
		outSideMap.put("USER", innerMap4Name);
		outSideMap.put("LOGINUSER", innerMap4LoginName);
	}
	
	/**
	 * 对外提供的方法：从用户视图中加载部门信息
	 */
	public void loadDept(){
		
		// 从表中查询出数据
		String sql ="select id,department_NAME from mcms_dept_info order by id";
		DBHelper dbh = DBHelper.getInstance();
		List listResult = dbh.query(sql);
		
		// 保存至本类
		Map innerMap4Name = new TreeMap();
		for(int i=0;i<listResult.size() ;i++){
			Map<String, String> map = (Map<String, String>) listResult.get(i);
			innerMap4Name.put(map.get("id"),map.get("department_name"));
		}
		outSideMap.put("DEPT", innerMap4Name);
	}
	
	/**
	 * 对外提供的方法：从用户视图中加载部门和用户关联信息
	 * 结构：DEPTUSER deptid为key 所有的成员user组成treemap为value（一个部门可以有多个用户）
	 *      USERDEPT userId为key，所在deptId为value（一个用户只能属于一个部门）
	 */
	public void loadDeptUser(){
		
		// 从表中查询出数据
		String sql = "select id,name,departmentid from view_mcms_user_info order by departmentid,id";
		DBHelper dbh = DBHelper.getInstance();
		List listResult = dbh.query(sql);
		
		// 将字典数据保存至本类中
		Map deptUserMap = new HashMap();// 放置到本类中的map，key为dept
		Map userDeptMap = new HashMap();
		for(int i=0; i<listResult.size(); i++){
			
			// 组装deptUser
			Map<String, String> map = (Map<String, String>) listResult.get(i);
			if(!deptUserMap.containsKey(map.get("departmentid"))){
				Map treeMap = new TreeMap();
				
				// 将userid和username放入此dept中
				treeMap.put(map.get("id"), map.get("name"));
				deptUserMap.put(map.get("departmentid"), treeMap);
			}else{
				((Map) deptUserMap.get(map.get("departmentid"))).put(map.get("id"), map.get("name"));
			}
			
			// 组装userDept
			userDeptMap.put(map.get("id"), map.get("departmentid"));
		}
		outSideMap.put("DEPTUSER", deptUserMap);
		outSideMap.put("USERDEPT", userDeptMap);
		
	}
	
	/**
	 * 对外提供的方法：从药物表中加载药物信息
	 * 结构：MEDI key为药物id，value为药物名称
	 *      MEDIINFO key为药物id,value为药物对象（名称，单价，生产企业）
	 */
	public void loadMedi(){

		// 从表中查询出数据
		String sql = "select id,MEDICINE_NAME,PRICE,MEDICINE_FACTORY from  mcms_medicine_info order by id";
		DBHelper dbh = DBHelper.getInstance();
		List listResult = dbh.query(sql);
		
		// 将字典数据保存至本类中
		Map MEDIMap = new TreeMap();// 放置到本类中的map，key为MEDI（key为mediid，value为mediname）
		Map MEDIINFOMap = new HashMap();// 放置到本类中的map，key为MEDIINFO(key为mediid，value为药物信息对象)
		Map medi = new HashMap();
		for(int i=0; i<listResult.size(); i++){
			
			// 组装mediinfomap
			Map<String, String> medimap = (Map<String, String>) listResult.get(i);
			MEDIINFOMap.put(medimap.get("id"), medimap);// 将本条药物信息放入map中
			
			// 组装medimap（key mid；value mname）
			MEDIMap.put(medimap.get("id"), medimap.get("medicine_name"));
			
		}
		outSideMap.put("MEDI", MEDIMap);
		outSideMap.put("MEDIINFO", MEDIINFOMap);
	}
	
	/**
	 * 对外提供的方法：从数据库中加载字典
	 */
	public void loadDict(){
		
		// 先将字典表数据查询出来
		String sqlStr = "select DICT_TYPE,DICT_CODE,DICT_NAME,DICT_ORDER from mcms_com_dict order by dict_type,dict_order";
		DBHelper dbh = DBHelper.getInstance();
		List listResult = dbh.query(sqlStr);
		
		// 将字典数据保存至本类中
		for(int i=0; i<listResult.size(); i++){
			Map<String, String> map = (Map<String, String>) listResult.get(i);
			if(!outSideMap.containsKey(map.get("DICT_TYPE"))){
				Map treeMap = new TreeMap();
				treeMap.put(map.get("DICT_CODE"), map.get("DICT_NAME"));
				outSideMap.put(map.get("DICT_TYPE"), treeMap);
			}else{
				((Map) outSideMap.get(map.get("DICT_TYPE"))).put(map.get("DICT_CODE"), map.get("DICT_NAME"));
			}
		}
	}
	
	public void printOutMap(){
//		遍历:组装完成的outSideMap(测试用)
		Set set =outSideMap.keySet();//       
		Iterator it=set.iterator();//       
		while(it.hasNext()){//           
			Object keys= (Object) it.next().toString();//
			Map map = (Map) outSideMap.get(keys);
			Set setInner =map.keySet();//       
			Iterator it2=setInner.iterator();//       
			while(it2.hasNext()){//           
				Object types= (Object) it2.next();//
				Object values = (Object) map.get(types);
				System.out.println("dic_type:"+keys+";key:"+types+";vlaue:"+values);
			}
		}
	}
}

